package service

import (
	"context"
	"fmt"
	"os"
	"time"

	"go.uber.org/zap"
)

// StopService 停止服务
// 示例值: 无参数
func (m *ServiceManager) StopService() error {
	zap.L().Info("停止SSH服务")
	
	if m.service == nil {
		return fmt.Errorf("服务实例未初始化")
	}
	
	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
	defer cancel()
	
	if err := m.service.Stop(ctx); err != nil {
		return fmt.Errorf("停止服务失败: %v", err)
	}
	
	zap.L().Info("SSH服务停止成功")
	return nil
}

// StartService 启动服务
// 示例值: 无参数
func (m *ServiceManager) StartService() error {
	zap.L().Info("启动SSH服务")
	
	if m.service == nil {
		return fmt.Errorf("服务实例未初始化")
	}
	
	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
	defer cancel()
	
	if err := m.service.Start(ctx); err != nil {
		return fmt.Errorf("启动服务失败: %v", err)
	}
	
	zap.L().Info("SSH服务启动成功")
	return nil
}

// RestartService 重启服务
// 示例值: 无参数
func (m *ServiceManager) RestartService() error {
	zap.L().Info("重启SSH服务")
	
	if m.service == nil {
		return fmt.Errorf("服务实例未初始化")
	}
	
	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
	defer cancel()
	
	if err := m.service.RestartService(ctx); err != nil {
		return fmt.Errorf("重启服务失败: %v", err)
	}
	
	zap.L().Info("SSH服务重启成功")
	return nil
}

// GetServiceStatus 获取服务状态
// 示例值: 无参数
func (m *ServiceManager) GetServiceStatus() (string, error) {
	zap.L().Info("获取SSH服务状态")
	
	if m.service == nil {
		return "unknown", fmt.Errorf("服务实例未初始化")
	}
	
	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
	defer cancel()
	
	status, err := m.service.GetServiceStatus(ctx)
	if err != nil {
		return "unknown", fmt.Errorf("获取服务状态失败: %v", err)
	}
	
	if status == nil {
		return "unknown", nil
	}
	
	// 返回服务的运行状态
	if status.Running {
		return "active", nil
	}
	return "inactive", nil
}

// CleanupExistingService 清理已存在的服务
// 示例值: 无参数
func (m *ServiceManager) CleanupExistingService() error {
	zap.L().Info("开始清理现有服务")
	
	if m.service == nil {
		return fmt.Errorf("服务实例未初始化")
	}
	
	// 检查服务是否正在运行
	status, err := m.GetServiceStatus()
	if err != nil {
		zap.L().Warn("获取服务状态失败，继续清理", zap.Error(err))
	} else if status == "active" {
		// 服务正在运行，先停止服务
		zap.L().Info("检测到服务正在运行，正在停止服务...")
		if err := m.StopService(); err != nil {
			zap.L().Warn("停止服务失败，尝试强制停止", zap.Error(err))
			// 尝试强制停止进程
			if err := m.forceStopServiceProcesses(); err != nil {
				zap.L().Warn("强制停止服务进程失败", zap.Error(err))
			}
		} else {
			zap.L().Info("服务已停止")
		}
	}
	
	// 等待一段时间确保进程完全退出
	time.Sleep(2 * time.Second)
	
	// 使用go-service库禁用服务
	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
	defer cancel()
	
	if err := m.service.Disable(ctx); err != nil {
		zap.L().Warn("禁用服务失败", zap.Error(err), zap.String("note", "可能服务未启用"))
	}
	
	// 使用go-service库移除服务
	if err := m.service.RemoveService(ctx); err != nil {
		zap.L().Warn("移除服务失败", zap.Error(err), zap.String("note", "可能服务不存在"))
	}
	
	// 检查并删除服务文件
	serviceFilePath := "/etc/systemd/system/ssh-auto-upgrade.service"
	if _, err := os.Stat(serviceFilePath); err == nil {
		zap.L().Info("检测到服务文件存在，正在删除...")
		if err := os.Remove(serviceFilePath); err != nil {
			return fmt.Errorf("删除服务文件失败: %v", err)
		}
		zap.L().Info("服务文件已删除")
	}
	
	// 检查并删除可执行文件 - 优先删除ssh-auto-upgrade，再删除ssh-upgrade
	execFilePaths := []string{
		"/usr/sbin/ssh-auto-upgrade",
		"/usr/sbin/ssh-upgrade",
	}
	
	for _, execFilePath := range execFilePaths {
		if _, err := os.Stat(execFilePath); err == nil {
			zap.L().Info("检测到可执行文件存在，正在删除...", zap.String("path", execFilePath))
			if err := os.Remove(execFilePath); err != nil {
				zap.L().Warn("删除可执行文件失败", zap.String("path", execFilePath), zap.Error(err))
			} else {
				zap.L().Info("可执行文件已删除", zap.String("path", execFilePath))
			}
		}
	}
	
	// 强制杀死任何残留的ssh-upgrade进程
	if err := m.killServiceProcesses(); err != nil {
		zap.L().Warn("清理服务进程失败", zap.Error(err))
	}
	
	// 使用go-service库更新服务配置以重载systemd
	ctx, cancel = context.WithTimeout(context.Background(), 10*time.Second)
	defer cancel()
	
	if err := m.service.UpdateService(ctx); err != nil {
		zap.L().Warn("更新服务配置失败", zap.Error(err))
	}
	
	zap.L().Info("现有服务清理完成")
	return nil
}

// forceStopServiceProcesses 强制停止服务进程
func (m *ServiceManager) forceStopServiceProcesses() error {
	zap.L().Info("强制停止服务进程")
	
	// 尝试使用systemctl强制停止
	// 这里我们直接使用进程杀手
	return m.killServiceProcesses()
}

// killServiceProcesses 杀死服务相关进程
func (m *ServiceManager) killServiceProcesses() error {
	zap.L().Info("清理ssh-upgrade相关进程")
	
	// 这里可以添加更复杂的进程清理逻辑
	// 目前使用简单的日志记录
	zap.L().Info("服务进程清理完成")
	return nil
}

// copyToSystemDir 将可执行文件复制到系统目录
func (m *ServiceManager) copyToSystemDir(sourcePath, destPath string) error {
	zap.L().Info("开始复制可执行文件到系统目录", 
		zap.String("source", sourcePath), 
		zap.String("destination", destPath))

	// 读取源文件
	sourceData, err := os.ReadFile(sourcePath)
	if err != nil {
		return fmt.Errorf("读取源文件失败: %v", err)
	}

	// 写入目标文件
	if err := os.WriteFile(destPath, sourceData, 0755); err != nil {
		return fmt.Errorf("写入目标文件失败: %v", err)
	}

	zap.L().Info("可执行文件复制成功", 
		zap.String("destination", destPath))
	return nil
}